package com.topvision.myviewtest.kotlin.part1

/**
 *
 * @author lucy
 * @date 2018-05-29 17:23
 * @description //条件表达式
 */

// 常规写法
/*
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

// if表达式
fun maxOf(a: Int, b: Int) = if (a > b) a else b

fun main(args: Array<String>) {
    val a = 10
    val b = 12
    print("max of $a and $b is ${maxOf(a, b)}")
    // out: max of 10 and 12 is 12
}
*/

// 当某个变量的值可以为 null 的时候，必须在声明处的类型后添加 ? 来标识该引用可为空。

// 如果 str 的内容不是数字返回 null
/*
fun parseInt(str: String): Int? {
    return str.toIntOrNull()
}

fun printProduct(str1: String, str2: String) {
    val x = parseInt(str1)
    val y = parseInt(str2)

    if (x != null && y != null) {
        println("$x * $y = ${x * y}")
    } else {
        println("either \"$str1\" or \"$str2\" is not a number")
    }
}

fun main(args: Array<String>) {
    printProduct("10", "30")
    // out: 10 * 30 = 300
    printProduct("a", "12")
    // out: either "a" or "12" is not a number
}
*/

// is 运算符检测一个表达式是否某类型的一个实例

/*
fun getStringLength(obj: Any): Int? {
//    if (obj is String) {
//        // `obj` 在该条件分支内自动转换成 `String`
//        return obj.length
//    }
//    return null

    // or use this way
//    if (obj !is String) return null
//    return obj.length

    // or use this way
    // `obj` 在 `&&` 右边自动转换成 `String` 类型
    if (obj is String && obj.length > 0) {
        return obj.length
    }
    return null
}

fun main(args: Array<String>) {
    // 函数中的函数
    fun printLength(obj: Any) {
        println("'$obj' string length is ${getStringLength(obj) ?: "error , is not a string"}")
    }
    printLength("abcdefg")
    // out: 'abcdefg' string length is 7
    printLength(10000)
    // out: '10000' string length is error , is not a string
    printLength(listOf(Any()))
    // out: '[java.lang.Object@4a574795]' string length is error , is not a string
}
*/

// for循环
/*
fun main(args: Array<String>) {
    val items = listOf("a", "b", "c", "d")
    // method 1
    for (item in items) {
        print(item)
    }
    // out: abcd

    // method 2
    for (index in items.indices) {
        println("item at $index is ${items[index]}")
    }
//        out:
//        item at 0 is a
//        item at 1 is b
//        item at 2 is c
//        item at 3 is d
}
*/

// while循环
/*
fun main(args: Array<String>) {
    val items = listOf("a", "b", "c", "d")
    var index = 0
    while (index < items.size) {
        println("item at $index is ${items[index]}")
        index++
    }
//        out:
//        item at 0 is a
//        item at 1 is b
//        item at 2 is c
//        item at 3 is d
}
*/

// when表达式
/*
fun describe(obj: Any): String =
        when (obj) {
            1 -> "one"
            "hello" -> "dear"
            is Long -> "is Long"
            !is String -> "is not String"
            else -> "UnKnown"
        }

fun main(args: Array<String>) {
    println(describe(1))
    println(describe("hello"))
    println(describe("10L"))
    println(describe(20f))
    println(describe("o"))

//out: one
//     dear
//     UnKnown
//     is not String
//     UnKnown
}
*/

// in的使用

/*
fun main(args: Array<String>) {
    val x = 10
    val y = 9
    if (y in 0..x) {
        println("$y in 0~$x")
    }
    // out: 9 in 0~10

    println(y !in 0..x)
    // out: false
}
*/

// 区间迭代
/*
fun main(args: Array<String>) {
    for (x in 0..7) {
        println(x)
    }
}
*/

// 数列迭代
/*
fun main(args: Array<String>) {
    for (x in 0..10 step 2) {
        println(x)
    }
//    out:
//    0
//    2
//    4
//    6
//    8
//    10
    println("-----------------------")
    // 倒序迭代
    for (x in 10 downTo  0 step 3) {
        println(x)
    }
//    out:
//        10
//        7
//        4
//        1
}
*/

// 集合迭代
/*
fun main(args: Array<String>) {
    val items = listOf("acaa", "abbb", "ccc")

    when {
        "a" in items -> println("a in items")
    }

    println("-----------------------")
    //使用 lambda 表达式来过滤（filter）和映射（map）集
    items
            .filter { it.startsWith("a") }
            .sortedBy { it }
            .map { it.toUpperCase() }
            .forEach { println(it) }
}
*/
